/*
 * @Author: Y先森
 * @Date: 2023-04-11 13:59:29
 * @LastEditors: y && 250048395@qq.com
 * @LastEditTime: 2023-05-03 16:05:01
 * @FilePath: \y-website\vite.config.js
 */
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import AutoImport from 'unplugin-auto-import/vite'  //自动导入 Composition API
import Components from 'unplugin-vue-components/vite' //组件自动按需引入
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
import { loadEnv } from 'vite'

import path from 'path'
import chalk from 'chalk'

// 引入多页面配置文件
const project = require('./scripts/multiPages.json')
// 获取npm run dev后缀 配置的环境变量
const npm_config_page = process.env.npm_config_page || ''
// 命令行报错提示
const errorLog = (error) => console.log(chalk.red(`${error}`))

//获取指定的单页面入口
const getEnterPages = () => {
  if (!npm_config_page)
    errorLog(
      '--------------请在命令行后以 `--page=页面名称` 格式指定页面名称！---------------'
    )
    console.log('npm_config_page=>',npm_config_page)    
  const filterArr = project.filter(
    (item) => item.chunk.toLowerCase() == npm_config_page.toLowerCase()
  )
  if (!filterArr.length)
    errorLog(
      '-----------------------不存在此页面，请检查页面名称！-------------------------'
    )
    
  return {
    [npm_config_page]: path.resolve(
      __dirname,
      `src/Project/${npm_config_page}/index.html`
    )
  }
}

// 获取当前模式 => mode
const mode = process.argv[process.argv.length - 1]
// 获取当前模式下的env参数 => env
const env = loadEnv(mode, process.cwd())

// https://vitejs.dev/config/
export default defineConfig({
  root: './src/Project/',
  base: mode === 'dev'?'./':'./',
  envDir: path.resolve(__dirname), //用于加载 .env 文件的目录。可以是一个绝对路径，也可以是相对于项目根的路径。
  // 构建配置
  build: {
    outDir: path.resolve(__dirname, `dist/${npm_config_page}`), // 指定输出路径
    assetsInlineLimit: 4096, //小于此阈值的导入或引用资源将内联为 base64 编码，以避免额外的 http 请求
    emptyOutDir: true, //Vite 会在构建时清空该目录
    rollupOptions: {
      // build 入口
      input: getEnterPages(),
      // build 输出
      output: {
        assetFileNames: '[ext]/[name]-[hash].[ext]',
        chunkFileNames: 'js/[name]-[hash].js',
        entryFileNames: 'js/[name]-[hash].js',
        compact: true,
        manualChunks: (id) => {
          if (id.includes('node_modules')) {
            return id
              .toString()
              .split('node_modules/')[1]
              .split('/')[0]
              .toString() // 拆分多个vendors
          }
        }
      }
    },
  },
  // 插件配置
  plugins: [
    vue(),
    AutoImport({
      imports: ['vue', 'vue-router', 'vuex'],
      dts: path.resolve(__dirname, './auto-import.d.ts'),
      eslintrc: {
        // 已存在文件设置默认 false，需要更新时再打开，防止每次更新都重新生成
        enabled: false,
        // 生成文件地址和名称
        filepath: path.resolve(__dirname, './.eslintrc-auto-import.json'),
        globalsPropValue: true
      }
    }),
    Components({
      resolvers: [ElementPlusResolver()]
    }),
    // 使用svg 配置
    createSvgIconsPlugin({
      // 指定要缓存的文件夹
      iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')],
      // 指定symbolId格式
      symbolId: 'icon-[name]'
    })
  ],
  // 软链接
  resolve: {
    alias: {
      '@': path.join(__dirname, './src/Project/y-blog'),
      '@Project': path.join(__dirname, './src/Project')
    }
  },
  // 接口配置
  server: {
    host: 'localhost',
    port: env.VITE_PORT,
    hmr: true,
    // 代理配置
    proxy: {
      '/api': {
        target: 'http://localhost:3002',
        changeOrigin: true
      }
    }
  }
})
